package com.hmall.user.config;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.rsa.crypto.KeyStoreKeyFactory;

import java.security.KeyPair;

/**
 * 安全配置类，负责配置系统安全相关的Bean
 * ConfigurationProperties 注解定义了配置属性的绑定规则（前缀、属性名等） hm.jwt
 * EnableConfigurationProperties 注解负责激活这种绑定机制并注册 Bean
 */
@Configuration
@EnableConfigurationProperties(JwtProperties.class)
public class SecurityConfig {

    /**
     * 配置密码编码器
     * 使用BCrypt算法进行密码加密和验证
     *
     * @return BCryptPasswordEncoder实例
     */
    @Bean
    public PasswordEncoder passwordEncoder() {

        // 创建BCrypt密码编码器，默认强度为10
        return new BCryptPasswordEncoder();
    }

    /**
     * 从密钥库文件中加载RSA密钥对
     *
     * @param properties JWT配置属性，包含密钥库位置、密码等信息
     * @return RSA密钥对实例
     */
    @Bean
    public KeyPair keyPair(JwtProperties properties) {
        // 创建KeyStoreKeyFactory实例，用于加载密钥库
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(
                        properties.getLocation(),           // 密钥库文件位置
                        properties.getPassword().toCharArray()  // 密钥库密码
        );

        // 从密钥库中获取指定别名的密钥对
        return keyStoreKeyFactory.getKeyPair(
                properties.getAlias(),                // 密钥别名
                properties.getPassword().toCharArray()); // 密钥密码（通常与密钥库密码相同）
    }
}